~pmdj/ubuntu/trusty/qemu/2.9+applesmc+fadtv3

« back to all changes in this revision

Viewing changes to roms/openbios/fs/hfsplus/include/hfsp.h

  • Committer: Phil Dennis-Jordan
  • Date: 2017-07-21 08:03:43 UTC
  • mfrom: (1.1.1)
  • Revision ID: phil@philjordan.eu-20170721080343-2yr2vdj7713czahv
New upstream release 2.9.0.

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
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 <khalfmann@libra.de>
 
10
 * Original code 1996-1998 by Robert Leslie <rob@mars.rog>
 
11
 * other work 2000 from Brad Boyer (flar@pants.nu)
 
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;