Annotation of qemu/roms/openbios/fs/hfsplus/include/hfsp.h, revision 1.1.1.1

1.1       root        1: /*
                      2:  * libhfsp - library for reading and writing Macintosh HFS+ volumes
                      3:  *
                      4:  * This file includes definitions for the structures found on
                      5:  * HFS+ Volumes. The structures are further wrapped by struct
                      6:  * found in libhfsp.h. fucntions on those enhanced structures
                      7:  * are found in files mentioned in comments below.
                      8:  *
                      9:  * Copyright (C) 2000 Klaus Halfmann <[email protected]>
                     10:  * Original code 1996-1998 by Robert Leslie <[email protected]>
                     11:  * other work 2000 from Brad Boyer ([email protected])
                     12:  *
                     13:  * This program is free software; you can redistribute it and/or modify
                     14:  * it under the terms of the GNU General Public License as published by
                     15:  * the Free Software Foundation; either version 2 of the License, or
                     16:  * (at your option) any later version.
                     17:  *
                     18:  * This program is distributed in the hope that it will be useful,
                     19:  * but WITHOUT ANY WARRANTY; without even the implied warranty of
                     20:  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
                     21:  * GNU General Public License for more details.
                     22:  *
                     23:  * You should have received a copy of the GNU General Public License
                     24:  * along with this program; if not, write to the Free Software
                     25:  * Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
                     26:  * MA 02110-1301, USA.
                     27:  *
                     28:  * $Id: hfsp.h,v 1.17 2000/10/20 06:16:52 hasi Exp $
                     29:  */
                     30: 
                     31: #define HFSP_BLOCKSZ            512    /* A sector for Apple is always 512 bytes */
                     32: #define HFSP_BLOCKSZ_BITS       9      /* 1<<9 == 512  */
                     33: #define        HFSP_VOLHEAD_SIG        0x482B  /* 'H+' */
                     34: 
                     35: /* HFS+ includes POSIX permissions , although marked as reserved they will be
                     36:  * used as such. Is ignored by MacOS 8-9 but probably not by MacOS X.
                     37:  */
                     38: typedef struct {
                     39:         UInt32         owner;
                     40:         UInt32         group;
                     41:         UInt32         mode;
                     42:         UInt32         dev;
                     43: } hfsp_perm;
                     44: 
                     45: /* A single contiguous area (fragment) of a file */
                     46: typedef struct {
                     47:         UInt32         start_block;
                     48:         UInt32         block_count;
                     49: } hfsp_extent;
                     50: 
                     51: /* A file may contain up to 8 normale extents, all other
                     52:    are found in some extra extent area */
                     53: typedef hfsp_extent hfsp_extent_rec[8];
                     54: 
                     55: /* Information for a "Fork" in a file
                     56:  * Forks are the "usual" DATA and RSRC forks or special files
                     57:  * (e.g. the Volume Bitmap)
                     58:  */
                     59: typedef struct {
                     60:         UInt64         total_size;  // logical size
                     61:         UInt32         clump_size;  // number of bytes to preallocate
                     62:         UInt32         total_blocks;
                     63:         hfsp_extent_rec extents;     // initial (8) extents
                     64: } hfsp_fork_raw;
                     65: 
                     66: /* HFS+ Volume Header
                     67:  * Always found at block 2 of the disk, a copy is stored
                     68:  * at the second to last block of the disk.
                     69:  */
                     70: typedef struct hfsp_vh {
                     71:         UInt16         signature;   // must be HFSPLUS_VOLHEAD_SIG 'H+'
                     72:         UInt16         version;     // currently 4, ignored
                     73:         UInt32         attributes;  // See bit constants below
                     74:         UInt32         last_mount_vers;
                     75:                 // Use a registered creator code here (what do we use ?)
                     76:                // Mac OS uses '8.10' well
                     77:         UInt32         reserved;
                     78: 
                     79:         UInt32         create_date; // local time !
                     80:         UInt32         modify_date; // GMT (?)
                     81:         UInt32         backup_date; // GMT (?)
                     82:         UInt32         checked_date; // GMT (?) fsck ?
                     83: 
                     84:         UInt32         file_count;
                     85:          // not including special files but including DATA and RSRC forks
                     86:         UInt32         folder_count; // excluding the root folder
                     87: 
                     88:         UInt32         blocksize;
                     89:          // must be multiple of HFSPLUS_SECTOR_SIZE,
                     90:          // should be a multiple of 4k for harddisk
                     91:         UInt32         total_blocks;
                     92:         UInt32         free_blocks;
                     93:          // The total number of unused allocation blocks on the disk.
                     94: 
                     95:         UInt32         next_alloc;
                     96:          // hint wher to search for next allocation blocks
                     97:         UInt32         rsrc_clump_sz;
                     98:          // default clump size for rsrc forks
                     99:         UInt32         data_clump_sz;
                    100:          // default clump size for data forks
                    101:         UInt32        next_cnid;
                    102:          // next unused catalog id
                    103:         UInt32         write_count;
                    104:          // increment on every mount (and write ?)
                    105:         UInt64        encodings_bmp;
                    106:                 // for every encoding used on the disk a bit is set
                    107:                 // ignored but eventually must be cared for
                    108:         Char          finder_info[32];
                    109:        hfsp_fork_raw   alloc_file;
                    110:          // stores bitmap of use/free blocks
                    111:         hfsp_fork_raw   ext_file;
                    112:          // stores oferflow extents
                    113:         hfsp_fork_raw   cat_file;
                    114:         // This contains the root directory
                    115:         hfsp_fork_raw   attr_file;
                    116:         hfsp_fork_raw   start_file;
                    117:          // a special startup file may be described here (used by ?)
                    118: } hfsp_vh;
                    119: 
                    120: /* HFS+ volume attributes */
                    121: /* 0-6 reserved, may be used in memory only */
                    122: #define HFSPLUS_VOL_RESERVED1 0x000000FF
                    123: #define HFSPLUS_VOL_HARDLOCK  0x00000080 // Used in Memory by finder only
                    124: #define HFSPLUS_VOL_UNMNT     0x00000100
                    125:         // clear this bit when mounting, set as last step of unmounting
                    126:         // This is checked by (slower) ROM code
                    127: #define HFSPLUS_VOL_SPARE_BLK 0x00000200
                    128: #define HFSPLUS_VOL_NOCACHE   0x00000400
                    129:         // in case of RAM or ROM disk (try a HFS+ Ramdisk :)
                    130: #define HFSPLUS_VOL_INCNSTNT  0x00000800
                    131:         // Reverse meaning as of HFSPLUS_VOL_UNMNT
                    132:         // This is checked by (faster) Mac OS code
                    133: /* 12-14 reserved */
                    134: #define HFSPLUS_VOL_RESERVED2 0x00007000
                    135: #define HFSPLUS_VOL_SOFTLOCK  0x00008000
                    136: #define HFSPLUS_VOL_RESERVED3 0xFFFF0000
                    137: 
                    138: /* HFS+ Btree node descriptor */
                    139: typedef struct {
                    140:        UInt32      next;   /* pointer to next node of this kind, or 0 */
                    141:        UInt32      prev;   /* pointer to previous node of this kind, or 0 */
                    142:        UInt8       kind;   /* see below */
                    143:        UInt8       height; /* root node starts with 0 */
                    144:        UInt16      num_rec;    /* number of records in this node */
                    145:        UInt16      reserved;   /* fill up to 4 byte alignment */
                    146: } btree_node_desc;
                    147: 
                    148: /* HFS+ Btree Node types */
                    149: #define HFSP_NODE_NDX  0x00
                    150: #define HFSP_NODE_HEAD 0x01
                    151: #define HFSP_NODE_MAP  0x02
                    152: #define HFSP_NODE_LEAF 0xFF
                    153: 
                    154: #define HFSP_CATALOG_MIN_NODE_SIZE  0x1000
                    155: #define HFSP_ATTRMIN_DOE_SIZE      0x1000
                    156: 
                    157: /* The record offsets are found at the end of the fork
                    158:  * containing the Btree */
                    159: 
                    160: typedef UInt16 btree_record_offset;
                    161: 
                    162: typedef struct {
                    163:         UInt16         depth;
                    164:            // equal to height of btree_node_desc
                    165:         UInt32         root;
                    166:            // root node of the hierarchy
                    167:         UInt32         leaf_count;
                    168:         UInt32         leaf_head;
                    169:         UInt32         leaf_tail;
                    170:         UInt16         node_size;
                    171:            // node size of _all_ nodes in this fork
                    172:         UInt16         max_key_len;
                    173:         UInt32         node_count;
                    174:            // count of all (free and used) nodes in tree
                    175:         UInt32         free_nodes;
                    176:         UInt16         reserved1;
                    177:         UInt32         clump_size;
                    178:          // ignored my MacOS used by ?
                    179:         UInt8         btree_type;
                    180:          // always 0 for HFS+
                    181:         UInt8         reserved2;
                    182:         UInt32         attributes;
                    183:         // see below
                    184:         UInt32         reserved3[16];
                    185: } btree_head;
                    186: 
                    187: /* BTree attributes */
                    188: #define HFSPLUS_BAD_CLOSE            0x01
                    189:   // Btree was not properly closed and should be checked
                    190:   // not used for HFS+ but reserved
                    191: #define HFSPLUS_TREE_BIGKEYS         0x02
                    192:   // always set for HFS+
                    193: #define HFSPLUS_TREE_VAR_NDXKEY_SIZE 0x04
                    194:   // use variable length index nodes, always set for catalog btree,
                    195:   // always cleared for extents btree.
                    196: 
                    197: #define HFSPLUS_TREE_UNUSED          0xFFFFFFF8
                    198: 
                    199: /* Some special File ID numbers */
                    200: #define HFSP_POR_CNID             1  /* Parent Of the Root */
                    201: #define HFSP_ROOT_CNID            2  /* ROOT directory */
                    202: #define HFSP_EXT_CNID             3  /* EXTents B-tree */
                    203: #define HFSP_CAT_CNID             4  /* CATalog B-tree */
                    204: #define HFSP_BAD_CNID             5  /* BAD blocks file */
                    205: #define HFSP_ALLOC_CNID           6  /* ALLOCation file */
                    206: #define HFSP_START_CNID           7  /* STARTup file */
                    207: #define HFSP_ATTR_CNID            8  /* ATTRibutes file  */
                    208: #define HFSP_EXCH_CNID           15  /* ExchangeFiles temp id */
                    209: #define HFPS_MIN_CNID           15  /* Minimum expected value */
                    210: 
                    211: /* Unicode String */
                    212: typedef struct {
                    213:     UInt16             strlen;
                    214:     UInt16             name[255];      // unicode charcters
                    215: } hfsp_unistr255;
                    216: 
                    217: /* HFS+ catalog entry key */
                    218: typedef struct {
                    219:     UInt16             key_length;     /* excluding length */
                    220:     UInt32             parent_cnid;
                    221:     hfsp_unistr255     name;
                    222: } hfsp_cat_key;
                    223: 
                    224: /* HFS+ exnteds entry key */
                    225: typedef struct {
                    226:     UInt16             key_length;     /* excluding length */
                    227:     UInt8              fork_type;      /* Seee below */
                    228:     UInt8              filler;
                    229:     UInt32             file_id;
                    230:     UInt32             start_block;
                    231: } hfsp_extent_key;
                    232: 
                    233: #define HFSP_EXTENT_DATA    0x00
                    234: #define HFSP_EXTENT_RSRC    0xFF
                    235: 
                    236: /* The key is followed by a record, an index or some other data */
                    237: 
                    238: /* The types of these records are defined as follows */
                    239: 
                    240: #define HFSP_FOLDER         0x0001  // entry fo a Folder
                    241: #define HFSP_FILE           0x0002  // entry for a File
                    242: #define HFSP_FOLDER_THREAD  0x0003
                    243:     // Like '.' in unix, identifies the folder by its id, only
                    244: #define HFSP_FILE_THREAD    0x0004
                    245:     // Im unsure if this is used by HFS+, too
                    246: 
                    247: /* HFS+ folder data (part of an hfsp_cat_entry) */
                    248: typedef struct {
                    249:     UInt16          flags;             /* no flags defined yet */
                    250:     UInt32         valence;            /* Numer of files and folders contained in folder */
                    251:     UInt32         id;
                    252:     UInt32         create_date;        // GMT
                    253:     UInt32         content_mod_date;   // GMT
                    254:     UInt32         attribute_mod_date; // GMT
                    255:     UInt32         access_date;        // GMT
                    256:     UInt32         backup_date;        // GMT
                    257:     hfsp_perm      permissions;
                    258:     DInfo          user_info;
                    259:     DXInfo         finder_info;
                    260:     UInt32         text_encoding;
                    261:         // hint fo the finder what encoding to use, unused here
                    262:     UInt32         reserved;
                    263: } hfsp_cat_folder;
                    264: 
                    265: /* HFS+ file data (part of a cat_entry) */
                    266: typedef struct {
                    267:     UInt16          flags;             /* See below */
                    268:     UInt32         reserved1;
                    269:     UInt32         id;
                    270:     UInt32         create_date;
                    271:     UInt32         content_mod_date;
                    272:     UInt32         attribute_mod_date;
                    273:     UInt32         access_date;
                    274:     UInt32         backup_date;
                    275:     hfsp_perm      permissions;
                    276:     FInfo           user_info;
                    277:     FXInfo         finder_info;
                    278:     UInt32         text_encoding;
                    279:     UInt32         reserved2;
                    280: 
                    281:     hfsp_fork_raw   data_fork;
                    282:     hfsp_fork_raw   res_fork;
                    283: } hfsp_cat_file;
                    284: 
                    285: /* File attribute bits */
                    286: #define HFSP_FILE_LOCKED      0x0001
                    287: #define HFSP_THREAD_EXISTS    0x0002 /* Always set in HFS+ */
                    288: 
                    289: /* HFS+ catalog thread (part of a cat_entry) */
                    290: typedef struct {
                    291:     UInt16          reserved;
                    292:     UInt32         parentID;
                    293:     hfsp_unistr255   nodeName;
                    294: } hfsp_cat_thread;
                    295: 
                    296: 
                    297: /* A data record in the catalog tree */
                    298: typedef struct {
                    299:     UInt16         type;
                    300:     union {
                    301:        hfsp_cat_folder folder;
                    302:        hfsp_cat_file   file;
                    303:        hfsp_cat_thread thread;
                    304:     } u;
                    305: } hfsp_cat_entry;

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.