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 */
|