/*
    libparted - a library for manipulating disk partitions
    Copyright (C) 2003, 2004, 2005 Free Software Foundation, Inc.

    This program is free software; you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation; either version 2 of the License, or
    (at your option) any later version.

    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.

    You should have received a copy of the GNU General Public License
    along with this program; if not, write to the Free Software
    Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/

#ifndef _HFS_H
#define _HFS_H

/* WARNING : bn is used 2 times in theses macro */
/* so _never_ use side effect operators when using them */
#define TST_BLOC_OCCUPATION(tab,bn) \
	(((tab)[(bn)/8])  &  (1<<(7-((bn)&7))))
#define SET_BLOC_OCCUPATION(tab,bn) \
	(((tab)[(bn)/8]) |=  (1<<(7-((bn)&7))))
#define CLR_BLOC_OCCUPATION(tab,bn) \
	(((tab)[(bn)/8]) &= ~(1<<(7-((bn)&7))))

/* Maximum number of blocks for the copy buffers */
#define BLOCK_MAX_BUFF	256
/* Maximum size of the copy buffers, in bytes */
#define BYTES_MAX_BUFF	8388608

/* Apple Creator Codes follow */
#define HFSP_IMPL_Shnk	0x53686e6b	/* in use */
#define HFSP_IMPL_Xpnd	0x58706e64	/* reserved */
#define HFSP_IMPL_Resz	0x5265737a	/* reserved */
#define HFSP_IMPL_PHpx	0x50482b78	/* reserved */
#define HFSP_IMPL_traP  0x74726150	/* reserved */
#define HFSP_IMPL_GnuP  0x476e7550	/* reserved */

#define HFS_SIGNATURE	0x4244		/* 'BD' */
#define HFSP_SIGNATURE	0x482B		/* 'H+' */
#define HFSX_SIGNATURE  0x4858		/* 'HX' */

#define HFSP_VERSION	 4
#define HFSX_VERSION	 5

#define HFS_HARD_LOCK	 7
#define HFS_UNMOUNTED	 8
#define HFS_BAD_SPARED	 9
#define HFS_SOFT_LOCK	15
#define HFSP_NO_CACHE	10
#define HFSP_INCONSISTENT 11
#define HFSP_REUSE_CNID	12
#define HFSP_JOURNALED	13

#define HFS_IDX_NODE	0x00
#define HFS_HDR_NODE	0x01
#define HFS_MAP_NODE	0x02
#define HFS_LEAF_NODE	0xFF

#define HFS_FIRST_REC	0x0E
#define HFS_NSD_HD_REC	0x78
#define HFS_MAP_REC	0xF8

#define HFS_DATA_FORK	0x00
#define HFS_RES_FORK	0xFF

#define HFS_CAT_DIR	0x01
#define HFS_CAT_FILE	0x02
#define HFS_CAT_DIR_TH	0x03
#define HFS_CAT_FILE_TH	0x04

#define HFSP_ATTR_INLINE	0x10
#define HFSP_ATTR_FORK		0x20
#define HFSP_ATTR_EXTENTS	0x30

#define HFS_ROOT_PAR_ID		0x01
#define HFS_ROOT_DIR_ID		0x02
#define HFS_XTENT_ID		0x03
#define HFS_CATALOG_ID		0x04
#define HFS_BAD_BLOCK_ID	0x05
#define HFSP_ALLOC_ID		0x06
#define HFSP_STARTUP_ID		0x07
#define HFSP_ATTRIB_ID		0x08
#define HFSP_BOGUS_ID		0x0F
#define HFSP_FIRST_AV_ID	0x10

#define HFSJ_JOURN_IN_FS	0x00
#define HFSJ_JOURN_OTHER_DEV	0x01
#define HFSJ_JOURN_NEED_INIT	0x02

#define HFSJ_HEADER_MAGIC	0x4a4e4c78
#define HFSJ_ENDIAN_MAGIC	0x12345678

#define HFSX_CASE_FOLDING	0xCF	/* case insensitive HFSX */
#define HFSX_BINARY_COMPARE	0xBC	/* case sensitive   HFSX */

#define HFS_EXT_NB	3
#define HFSP_EXT_NB	8

/* Define the filenames used by the FS extractor */
#ifdef HFS_EXTRACT_FS

#define HFS_MDB_FILENAME	"mdb.hfs"
#define HFS_CATALOG_FILENAME	"catalog.hfs"
#define HFS_EXTENTS_FILENAME	"extents.hfs"
#define HFS_BITMAP_FILENAME	"bitmap.hfs"

#define HFSP_VH_FILENAME	"vh.hfsplus"
#define HFSP_CATALOG_FILENAME	"catalog.hfsplus"
#define HFSP_EXTENTS_FILENAME	"extents.hfsplus"
#define HFSP_BITMAP_FILENAME	"bitmap.hfsplus"
#define HFSP_ATTRIB_FILENAME	"attributes.hfsplus"
#define HFSP_STARTUP_FILENAME	"startup.hfsplus"

#endif /* HFS_EXTRACT_FS */



/* ----------------------------------- */
/* --      HFS DATA STRUCTURES      -- */
/* ----------------------------------- */

/* Extent descriptor */
struct __attribute__ ((packed)) _HfsExtDescriptor {
        uint16_t	start_block;
        uint16_t	block_count;
};
typedef struct _HfsExtDescriptor HfsExtDescriptor;
typedef HfsExtDescriptor HfsExtDataRec[HFS_EXT_NB];

/* Volume header */
struct __attribute__ ((packed)) _HfsMasterDirectoryBlock {
        uint16_t         signature;
        uint32_t         create_date;
        uint32_t         modify_date;
        uint16_t         volume_attributes;
        uint16_t         files_in_root;
        uint16_t         volume_bitmap_block;       /* in sectors */
        uint16_t         next_allocation;
        uint16_t         total_blocks;
        uint32_t         block_size;                /* in bytes */
        uint32_t         def_clump_size;            /* in bytes */
        uint16_t         start_block;               /* in sectors */
        uint32_t         next_free_node;
        uint16_t         free_blocks;
        uint8_t          name_length;
        char             name[27];
        uint32_t         backup_date;
        uint16_t         backup_number;
        uint32_t         write_count;
        uint32_t         extents_clump;
        uint32_t         catalog_clump;
        uint16_t         dirs_in_root;
        uint32_t         file_count;
        uint32_t         dir_count;
        uint32_t         finder_info[8];
        union __attribute__ ((packed)) {
                struct __attribute__ ((packed)) {
                        uint16_t    volume_cache_size;    /* in blocks */
                        uint16_t    bitmap_cache_size;    /* in blocks */
                        uint16_t    common_cache_size;    /* in blocks */
                } legacy;
                struct __attribute__ ((packed)) {
                        uint16_t            signature;
                        HfsExtDescriptor    location;
                } embedded;
        } old_new;
        uint32_t         extents_file_size;  /* in bytes, block size multiple */
        HfsExtDataRec    extents_file_rec;
        uint32_t         catalog_file_size;  /* in bytes, block size multiple */
        HfsExtDataRec    catalog_file_rec;
};
typedef struct _HfsMasterDirectoryBlock HfsMasterDirectoryBlock;

/* B*-Tree Node Descriptor */
struct __attribute__ ((packed)) _HfsNodeDescriptor {
        uint32_t        next;
        uint32_t        previous;
        int8_t          type;
        uint8_t         height;
        uint16_t        rec_nb;
        uint16_t        reserved;
};
typedef struct _HfsNodeDescriptor HfsNodeDescriptor;

/* Header record of a whole B*-Tree */
struct __attribute__ ((packed)) _HfsHeaderRecord {
        uint16_t        depth;
        uint32_t        root_node;
        uint32_t        leaf_records;
        uint32_t        first_leaf_node;
        uint32_t        last_leaf_node;
        uint16_t        node_size;
        uint16_t        max_key_len;
        uint32_t        total_nodes;
        uint32_t        free_nodes;
        int8_t          reserved[76];
};
typedef struct _HfsHeaderRecord HfsHeaderRecord;

/* Catalog key for B*-Tree lookup in the catalog file */
struct __attribute__ ((packed)) _HfsCatalogKey {
        uint8_t         key_length; /* length of the key without key_length */
        uint8_t         reserved;
        uint32_t        parent_ID;
        uint8_t         name_length;
        char            name[31];   /* in fact physicaly 1 upto 31 */
};
typedef struct _HfsCatalogKey HfsCatalogKey;

/* Extents overflow key for B*-Tree lookup */
struct __attribute__ ((packed)) _HfsExtentKey {
        uint8_t         key_length; /* length of the key without key_length */
        uint8_t         type;       /* data or ressource fork */
        uint32_t        file_ID;
        uint16_t        start;
};
typedef struct _HfsExtentKey HfsExtentKey;

/* Catalog subdata case directory */
struct __attribute__ ((packed)) _HfsDir {
        uint16_t        flags;
        uint16_t        valence;        /* number of files in this directory */
        uint32_t        dir_ID;
        uint32_t        create_date;
        uint32_t        modify_date;
        uint32_t        backup_date;
        int8_t          DInfo[16];      /* used by Finder, handle as reserved */
        int8_t          DXInfo[16];     /* used by Finder, handle as reserved */
        uint32_t        reserved[4];
};
typedef struct _HfsDir HfsDir;

/* Catalog subdata case file */
struct __attribute__ ((packed)) _HfsFile {
        int8_t          flags;
        int8_t          type;           /* should be 0 */
        int8_t          FInfo[16];      /* used by Finder, handle as reserved */
        uint32_t        file_ID;
        uint16_t        data_start_block;
        uint32_t        data_sz_byte;
        uint32_t        data_sz_block;
        uint16_t        res_start_block;
        uint32_t        res_sz_byte;
        uint32_t        res_sz_block;
        uint32_t        create_date;
        uint32_t        modify_date;
        uint32_t        backup_date;
        int8_t          FXInfo[16];     /* used by Finder, handle as reserved */
        uint16_t        clump_size;
        HfsExtDataRec   extents_data;
        HfsExtDataRec   extents_res;
        uint32_t        reserved;
};
typedef struct _HfsFile HfsFile;

/* Catalog subdata case directory thread */
struct __attribute__ ((packed)) _HfsDirTh {
        uint32_t        reserved[2];
        uint32_t        parent_ID;
        int8_t          name_length;
        char            name[31];
};
typedef struct _HfsDirTh HfsDirTh;

/* Catalog subdata case file thread */
typedef struct _HfsDirTh HfsFileTh;        /* same as directory thread */

/* Catalog data */
struct __attribute__ ((packed)) _HfsCatalog {
        int8_t          type;
        int8_t          reserved;
        union {
                HfsDir       dir;
                HfsFile      file;
                HfsDirTh     dir_th;
                HfsFileTh    file_th;
        } sel;
};
typedef struct _HfsCatalog HfsCatalog;



/* ------------------------------------ */
/* --      HFS+ DATA STRUCTURES      -- */
/* ------------------------------------ */

/* documented since 2004 in tn1150 */
struct __attribute__ ((packed)) _HfsPPerms {
        uint32_t        owner_ID;
        uint32_t        group_ID;
        uint32_t        permissions;
        uint32_t        special_devices;
};
typedef struct _HfsPPerms HfsPPerms;

/* HFS+ extent descriptor*/
struct __attribute__ ((packed)) _HfsPExtDescriptor {
        uint32_t        start_block;
        uint32_t        block_count;
};
typedef struct _HfsPExtDescriptor HfsPExtDescriptor;
typedef HfsPExtDescriptor HfsPExtDataRec[HFSP_EXT_NB];

/* HFS+ fork data structure */
struct __attribute__ ((packed)) _HfsPForkData {
        uint64_t        logical_size;
        uint32_t        clump_size;
        uint32_t        total_blocks;
        HfsPExtDataRec  extents;
};
typedef struct _HfsPForkData HfsPForkData;

/* HFS+ catalog node ID */
typedef uint32_t HfsPNodeID;

/* HFS+ file names */
typedef uint16_t unichar;
struct __attribute__ ((packed)) _HfsPUniStr255 {
        uint16_t        length;
        unichar         unicode[255];        /* 1 upto 255 */
};
typedef struct _HfsPUniStr255 HfsPUniStr255;

/* HFS+ volume header */
struct __attribute__ ((packed)) _HfsPVolumeHeader {
        uint16_t        signature;
        uint16_t        version;
        uint32_t        attributes;
        uint32_t        last_mounted_version;
        uint32_t        journal_info_block;
        
        uint32_t        create_date;
        uint32_t        modify_date;
        uint32_t        backup_date;
        uint32_t        checked_date;
        
        uint32_t        file_count;
        uint32_t        dir_count;
        
        uint32_t        block_size;
        uint32_t        total_blocks;
        uint32_t        free_blocks;
        
        uint32_t        next_allocation;
        uint32_t        res_clump_size;
        uint32_t        data_clump_size;
        HfsPNodeID      next_catalog_ID;
        
        uint32_t        write_count;
        uint64_t        encodings_bitmap;
        
        uint8_t         finder_info[32];
        
        HfsPForkData    allocation_file;
        HfsPForkData    extents_file;
        HfsPForkData    catalog_file;
        HfsPForkData    attributes_file;
        HfsPForkData    startup_file;
};
typedef struct _HfsPVolumeHeader HfsPVolumeHeader;

/* HFS+ B-Tree Node Descriptor. Same as HFS btree. */
struct __attribute__ ((packed)) _HfsPNodeDescriptor {
        uint32_t        next;
        uint32_t        previous;
        int8_t          type;
        uint8_t         height;
        uint16_t        rec_nb;
        uint16_t        reserved;
};
typedef struct _HfsPNodeDescriptor HfsPNodeDescriptor;

/* Header record of a whole HFS+ B-Tree. */
struct __attribute__ ((packed)) _HfsPHeaderRecord {
        uint16_t        depth;
        uint32_t        root_node;
        uint32_t        leaf_records;
        uint32_t        first_leaf_node;
        uint32_t        last_leaf_node;
        uint16_t        node_size;
        uint16_t        max_key_len;
        uint32_t        total_nodes;
        uint32_t        free_nodes;        /* same as hfs btree until here */
        uint16_t        reserved1;
        
        uint32_t        clump_size;
        uint8_t         btree_type;        /* must be 0 for HFS+ B-Tree */
        uint8_t         key_compare_type; /* hfsx => 0xCF = case folding */
                                          /*         0xBC = binary compare */
                                          /* otherwise, reserved */
        uint32_t        attributes;
        uint32_t        reserved3[16];
};
typedef struct _HfsPHeaderRecord HfsPHeaderRecord;

/* Catalog key for B-Tree lookup in the HFS+ catalog file */
struct __attribute__ ((packed)) _HfsPCatalogKey {
        uint16_t        key_length;
        HfsPNodeID      parent_ID;
        HfsPUniStr255   node_name;
};
typedef struct _HfsPCatalogKey HfsPCatalogKey;

/* HFS+ catalog subdata case dir */
struct __attribute__ ((packed)) _HfsPDir {
        uint16_t        flags;
        uint32_t        valence;
        HfsPNodeID      dir_ID;
        uint32_t        create_date;
        uint32_t        modify_date;
        uint32_t        attrib_mod_date;
        uint32_t        access_date;
        uint32_t        backup_date;
        HfsPPerms       permissions;
        int8_t          DInfo[16];        /* used by Finder, handle as reserved */
        int8_t          DXInfo[16];       /* used by Finder, handle as reserved */
        uint32_t        text_encoding;
        uint32_t        reserved;
};
typedef struct _HfsPDir HfsPDir;

/* HFS+ catalog subdata case file */
struct __attribute__ ((packed)) _HfsPFile {
        uint16_t        flags;
        uint32_t        reserved1;
        HfsPNodeID      file_ID;
        uint32_t        create_date;
        uint32_t        modify_date;
        uint32_t        attrib_mod_date;
        uint32_t        access_date;
        uint32_t        backup_date;
        HfsPPerms       permissions;
        int8_t          FInfo[16];        /* used by Finder, handle as reserved */
        int8_t          FXInfo[16];       /* used by Finder, handle as reserved */
        uint32_t        text_encoding;
        uint32_t        reserved2;
        
        HfsPForkData    data_fork;
        HfsPForkData    res_fork;
};
typedef struct _HfsPFile HfsPFile;

/* HFS+ catalog subdata case thread */
struct __attribute__ ((packed)) _HfsPThread {
        int16_t         reserved;
        HfsPNodeID      parent_ID;
        HfsPUniStr255   node_name;
};
typedef struct _HfsPThread HfsPDirTh;
typedef struct _HfsPThread HfsPFileTh;

/* HFS+ Catalog leaf data */
struct __attribute__ ((packed)) _HfsPCatalog {
        int16_t         type;
        union {
                HfsPDir         dir;
                HfsPFile        file;
                HfsPDirTh       dir_th;
                HfsPFileTh      file_th;
        } sel;
};
typedef struct _HfsPCatalog HfsPCatalog;

/* HFS+ extents file key */
struct __attribute__ ((packed)) _HfsPExtentKey {
        uint16_t        key_length;
        uint8_t         type;
        uint8_t         pad;
        HfsPNodeID      file_ID;
        uint32_t        start;
};
typedef struct _HfsPExtentKey HfsPExtentKey;

/* extent file data is HfsPExtDataRec */

/* Fork data attribute file */
struct __attribute__ ((packed)) _HfsPForkDataAttr {
        uint32_t        record_type;
        uint32_t        reserved;
        union __attribute__ ((packed)) {
                HfsPForkData        fork;
                HfsPExtDataRec      extents;
        } fork_res;
};
typedef struct _HfsPForkDataAttr HfsPForkDataAttr;


/* ----------- Journal data structures ----------- */

/* Info block : stored in a block # defined in the VH */
struct __attribute__ ((packed)) _HfsJJournalInfoBlock {
        uint32_t        flags;
        uint32_t        device_signature[8];
        uint64_t        offset;
        uint64_t        size;
        uint32_t        reserved[32];
};
typedef struct _HfsJJournalInfoBlock HfsJJournalInfoBlock;

struct __attribute__ ((packed)) _HfsJJournalHeader {
        uint32_t        magic;
        uint32_t        endian;
        uint64_t        start;
        uint64_t        end;
        uint64_t        size;
        uint32_t        blhdr_size;
        uint32_t        checksum;
        uint32_t        jhdr_size;
};
typedef struct _HfsJJournalHeader HfsJJournalHeader;

struct __attribute__ ((packed)) _HfsJBlockInfo {
        uint64_t        bnum;          /* sector number */
        uint32_t        bsize;         /* size in bytes */
        uint32_t        next;
};
typedef struct _HfsJBlockInfo HfsJBlockInfo;

struct __attribute__ ((packed)) _HfsJBlockListHeader {
        uint16_t        max_blocks;    /* reserved */
        uint16_t        num_blocks;
        uint32_t        bytes_used;
        uint32_t        checksum;
        uint32_t        pad;
        HfsJBlockInfo   binfo[1];
};
typedef struct _HfsJBlockListHeader HfsJBlockListHeader;



/* ---------------------------------------- */
/* --      INTERNAL DATA STRUCTURES      -- */
/* ---------------------------------------- */

/* Data of an opened HFS file */
struct _HfsPrivateFile {
        PedSector       sect_nb;
        PedFileSystem*  fs;
        uint32_t        CNID;          /* disk order (BE) */
        HfsExtDataRec   first;         /* disk order (BE) */
        HfsExtDataRec   cache;         /* disk order (BE) */
        uint16_t        start_cache;   /* CPU order */
};
typedef struct _HfsPrivateFile HfsPrivateFile;

/* To store bad block list */
struct _HfsPrivateLinkExtent {
        HfsExtDescriptor                 extent;
        struct _HfsPrivateLinkExtent*    next;
};
typedef struct _HfsPrivateLinkExtent HfsPrivateLinkExtent;

/* HFS Filesystem specific data */
struct _HfsPrivateFSData {
        uint8_t                     alloc_map[(1<<16) / 8];
        HfsMasterDirectoryBlock*    mdb;
        HfsPrivateFile*             extent_file;
        HfsPrivateFile*             catalog_file;
        HfsPrivateLinkExtent*       bad_blocks_xtent_list;
        unsigned int                bad_blocks_xtent_nb;
        char                        bad_blocks_loaded;
};
typedef struct _HfsPrivateFSData HfsPrivateFSData;

/* Generic btree key */
struct __attribute__ ((packed)) _HfsPrivateGenericKey {
        uint8_t         key_length;
        uint8_t         key_content[1];                /* we use 1 as a minimum size */
};
typedef struct _HfsPrivateGenericKey HfsPrivateGenericKey;

/* ----- HFS+ ----- */

/* Data of an opened HFS file */
struct _HfsPPrivateFile {
        PedSector       sect_nb;
        PedFileSystem*  fs;
        HfsPNodeID      CNID;          /* disk order (BE) */
        HfsPExtDataRec  first;         /* disk order (BE) */
        HfsPExtDataRec  cache;         /* disk order (BE) */
        uint32_t        start_cache;   /* CPU order */
};
typedef struct _HfsPPrivateFile HfsPPrivateFile;

struct _HfsPPrivateExtent {
        PedSector       start_sector;
        PedSector       sector_count;
};
typedef struct _HfsPPrivateExtent HfsPPrivateExtent;

/* To store bad block list */
struct _HfsPPrivateLinkExtent {
        HfsPExtDescriptor                 extent;
        struct _HfsPPrivateLinkExtent*    next;
};
typedef struct _HfsPPrivateLinkExtent HfsPPrivateLinkExtent;

/* HFS+ file system specific data */
struct _HfsPPrivateFSData {
        PedFileSystem*          wrapper;      /* NULL if hfs+ is not embedded */
        PedGeometry*            plus_geom;    /* Geometry of HFS+ _volume_ */
        uint8_t*                alloc_map;
        uint8_t*                dirty_alloc_map;
        HfsPVolumeHeader*       vh;
        HfsPPrivateFile*        extents_file;
        HfsPPrivateFile*        catalog_file;
        HfsPPrivateFile*        attributes_file;
        HfsPPrivateFile*        allocation_file;
        HfsPPrivateLinkExtent*  bad_blocks_xtent_list;
        uint32_t                jib_start_block;
        uint32_t                jl_start_block;
        unsigned int            bad_blocks_xtent_nb;
        char                    bad_blocks_loaded;
        char                    free_geom;    /* 1 = plus_geom must be freed */
};
typedef struct _HfsPPrivateFSData HfsPPrivateFSData;

/* Generic + btree key */
struct __attribute__ ((packed)) _HfsPPrivateGenericKey {
        uint16_t        key_length;
        uint8_t         key_content[1];       /* we use 1 as a minimum size */
};
typedef struct _HfsPPrivateGenericKey HfsPPrivateGenericKey;

/* ---- common ---- */

/* node and lead record reference for a BTree search */
struct _HfsCPrivateLeafRec {
        unsigned int    node_size;     /* in sectors */
        unsigned int    node_number;
        unsigned int    record_pos;
        unsigned int    record_number;
};
typedef struct _HfsCPrivateLeafRec HfsCPrivateLeafRec;

extern uint8_t*    hfs_block;
extern uint8_t*    hfsp_block;
extern unsigned    hfs_block_count;
extern unsigned    hfsp_block_count;

#endif /* _HFS_H */
