1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
|
/*
* libhfs - library for reading and writing Macintosh HFS volumes
* Copyright (C) 2000 Klaus Halfmann (khalfmann@libra.de)
* Original work by 1996-1998 Robert Leslie (rob@mars.org)
*
* This file defines constants,structs etc needed for this library.
* Everything found here is usually not related to Apple defintions.
*
* 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 Street - Fifth Floor, Boston,
* MA 02110-1301, USA.
*
* $Id: libhfsp.h,v 1.17 2000/10/20 06:16:52 hasi Exp $
*/
# include "apple.h"
# include "hfs.h"
# include "hfsp.h"
/* Last error is eventually found here */
extern const char *hfsp_error;
# define HFSP_ERROR(code, str) \
do { hfsp_error = (str), errno = (code); goto fail; } while (0)
# ifdef DEBUG
# define ASSERT(cond) do { if (! (cond)) abort(); } while (0)
# else
# define ASSERT(cond) /* nothing */
# endif
# define SIZE(type, n) ((size_t) (sizeof(type) * (n)))
# define ALLOC(type, n) ((type *) malloc(SIZE(type, n)))
# define ALLOCX(type, n) ((n) ? ALLOC(type, n) : (type *) 0)
# define FREE(ptr) ((ptr) ? (void) free((void *) ptr) : (void) 0)
# define REALLOC(ptr, type, n) \
((type *) ((ptr) ? realloc(ptr, SIZE(type, n)) : malloc(SIZE(type, n))))
# define REALLOCX(ptr, type, n) \
((n) ? REALLOC(ptr, type, n) : (FREE(ptr), (type *) 0))
# define BMTST(bm, num) \
(((const byte *) (bm))[(num) >> 3] & (0x80 >> ((num) & 0x07)))
# define BMSET(bm, num) \
(((byte *) (bm))[(num) >> 3] |= (0x80 >> ((num) & 0x07)))
# define BMCLR(bm, num) \
(((byte *) (bm))[(num) >> 3] &= ~(0x80 >> ((num) & 0x07)))
# define STRINGIZE(x) #x
# define STR(x) STRINGIZE(x)
/* used by internal routines to specify the open modes */
# define HFSP_MODE_RDONLY 0
# define HFSP_MODE_RDWR 1
# define HFSP_MODE_ANY 2
/* Signatures registered with Apple to identify this driver */
/* Identifies the userland implementation */
# define HPLS_SIGNATURE 0x482B4C58 // 'H+LX'
/* Identifies the kernel module by Brad Boyer (flar@pants.nu) */
# define HPLS_SIGRES1 0x482B4C78 // 'H+Lx'
/* not jet in use ... */
# define HPLS_SIGRES2 0x482B6C78 // 'H+lx'
/* Signature used by Apple */
# define HPAPPLE_SIGNATURE 0x382e3130 // '8.10'
/* Version used for this implementation of HFS+. This is not related
* to the VERSION file found at the top-level of this package,
* but designates the version of the low level code */
#define HPLS_VERSION 1 /* must fit in a short */
/* Othe Signatures may follow for informational purpos */
/* prototype for key comparing functions. */
typedef int (*hfsp_key_compare) (void* key1, void* key2);
/* prototype for key reading (necessary for byte swapping) */
typedef void* (*hfsp_key_read) (void* p, void* key);
struct volume; /* foreward declaration for btree needed */
/* Structures for a node cache. The cache is an array
* with linear search. (So making it to big may make
* things slower). It is searched in a round robin
* fashion.
*/
typedef struct
{
UInt32 priority;
// as lower this number as higher the priority.
// decremetned on any sucessfull usage
// incremented else, intial value height*DEPTHFACTOR
UInt16 index; // of node in fork
// 0 means empty, since first node is node header
// contents of node in original byte order
UInt16 flags; // like DIRTY etc.
} node_entry;
typedef struct
{
UInt32 index; // duplicate of above
btree_node_desc desc; // header of node
char node[0]; // actual node_size
// contents of node in original byte order
} node_buf;
typedef struct
{
int size; // number of nodes in the cache
int currindex; // round robin index
int nodebufsize; // size of complete node_buf, including node
node_entry *entries;
char *buffers; // actually *node_buf
} node_cache;
typedef struct
{
struct volume* vol; /* pointer to volume this tree is part of */
hfsp_fork_raw* fork; /* pointer to fork this tree is part of */
UInt32 cnid; /* (pseudo) file id for the fork */
hfsp_key_compare kcomp;
/* function used for key compare in _this_ btree */
hfsp_key_read kread;
/* fucntion used to read a key int _this_ btree */
btree_head head;
UInt16 blkpernode;
/* Number of volume blocks per node (usually 1-4) */
node_cache cache;
/* Warning all functions of btrees and records may modify
the following values ! */
// UInt16 node_index; /* index of node in fork */
// btree_node_desc node; /* current node under examination */
// char* buf; /* buf with size of a node */
} btree;
/* Function on btrees are defined in btree.h */
/* A Wrapper around the raw hfs+ volume header for additional information
* needed by this library.
*/
typedef struct volume
{
int os_fd; /* OS dependend reference to device */
UInt16 blksize_bits; /* blocksize of device = 1 << blksize_bits */
UInt16 filler;
UInt32 blksize; /* always 1 << blksize_bits */
UInt32 startblock;
/* Offset from physical to logical blocks,
eventually intodruced by HFS wrapper */
UInt32 maxblocks; /* maximum number of blocks in device */
// UInt32 currblock; /* value of current block, to cache blocks */
hfsp_vh vol; /* raw volume data */
// void* blockbuf; /* (single) buffer for fetching one block */
/* Buffer has double size of blksize to allow cross block reading */
btree* extents; /* is NULL by default and intialized when needed */
btree catalog; /* This is always neeeded */
} volume;
/* Functions on volumes are defined in volume.h */
typedef struct { // may not be used as found here
btree* tree; // tree where this record is contained in.
UInt16 node_index; /* index of record in btree */
UInt16 keyind; /* index of current key in btree */
hfsp_cat_key key; /* current key */
UInt32 child; /* child node belonging to this key */
} index_record;
typedef struct {
btree* tree; // tree where this record is contained in.
UInt16 node_index; /* index of record in btree */
UInt16 keyind; /* index of current key in btree */
hfsp_extent_key key; /* current key */
hfsp_extent_rec extent; /* The payload carried around */
} extent_record;
typedef struct {
btree* tree; // tree where this record is contained in.
UInt16 node_index; /* index of record in btree */
UInt16 keyind; /* index of current key in btree */
hfsp_cat_key key; /* current key */
hfsp_cat_entry record; /* current record */
} record;
/* Functions on records are defined in record.h */
|